#ifndef ISISTEMA_H
#define ISISTEMA_H

#include "Cadena.h"
#include "Iterador.h"
#include "Puntero.h"
#include "TipoRetorno.h"
#include "Tupla.h"
#include "ICiudad.h"
#include "TipoTransporte.h"

class ISistema abstract
{
public:
	virtual ~ISistema(){}

	// Tipo 1
	virtual TipoRetorno IngresoTramo(Cadena nombreCiudadOrigen, Cadena nombreCiudadDestino, nat distancia, TipoTransporte tipoTransporte) abstract;
	virtual Tupla<TipoRetorno, Puntero<Iterador<Tupla<TipoTransporte, Puntero<Iterador<pCiudad>>, nat>>>> Presupuesto(Cadena nombreCiudadOrigen, Cadena nombreCiudadDestino) abstract;
	virtual Tupla<TipoRetorno, bool> HayCamino(Cadena nombreCiudadOrigen, Cadena nombreCiudadDestino, TipoTransporte tipoTransporte) abstract;
	virtual Tupla<TipoRetorno, Puntero<Iterador<Tupla<Puntero<Iterador<pCiudad>>, nat>>>> CaminoMasCorto(Cadena nombreCiudadOrigen) abstract;
	virtual Tupla<TipoRetorno, nat, Puntero<Iterador<Tupla<Cadena, nat>>>> ItemsValiosos(Puntero<Iterador<Tupla<Cadena, nat, nat, nat>>> items, nat pesoMaximo) abstract;

	// Tipo 2
	virtual Tupla<TipoRetorno, nat> TendidoMenorCosto() abstract;
	virtual Tupla<TipoRetorno, Puntero<Iterador<Tupla<Puntero<Iterador<pCiudad>>, nat>>>> CaminoMasBaratoNoPasaPor(Cadena nombreCiudadOrigen, Puntero<Iterador<Cadena>> excluidas, TipoTransporte tipoTransporte) abstract;
	virtual Tupla<TipoRetorno, nat, Puntero<Iterador<pCiudad>>> Itinerario(Puntero<Iterador<Cadena>> ciudades) abstract;

	// Opcional
	virtual Tupla<TipoRetorno, Puntero<Iterador<pCiudad>>> CiudadesFijas() abstract;

	// Requeridas
	virtual TipoRetorno IngresoCiudad(Cadena nombre, nat costoDiario) abstract;
	virtual Tupla<TipoRetorno, Puntero<Iterador<pCiudad>>> ListCiudades() abstract;
};

#endif
